/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sni.org.pe.session;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import sni.org.pe.model.OpcionSistema;
import sni.org.pe.model.Perfil;
import sni.org.pe.model.PerfilOpcionSistema;
import sni.org.pe.model.PerfilOpcionSistemaPK;
import sni.org.pe.session.remote.PerfilSessionEJBRemote;

/**
 *
 * @author ehuamani
 */
@Stateless
public class PerfilSessionEJB implements PerfilSessionEJBRemote {

    @PersistenceContext(unitName = "persistenciaPU")
    private EntityManager em;

    protected EntityManager getEntityManager() {
        return em;
    }

    public PerfilSessionEJB() {
    }

    @Override
    public List<Perfil> findAll() {
        return em.createNamedQuery("Perfil.findAll").getResultList();
    }

    @Override
    public List<Perfil> findByName(String nombre, Integer estado) {
        List<Perfil> perfilList = null;
        try {
            StringBuffer sql = new StringBuffer("Select p from Perfil p where 1=1 ");
            if (nombre != null && nombre.length() > 0) {
                sql.append("and p.nombreperfil like :nombreperfil ");
            }
            if (estado != -1) {
                sql.append("and p.iseditperfil = :iseditperfil ");
            }
            sql.append(" order by p.nombreperfil");
            Query q = em.createQuery(sql.toString());
            if (nombre != null && nombre.length() > 0) {
                q.setParameter("nombreperfil", "%" + nombre + "%");
            }
            if (estado != -1) {
                q.setParameter("iseditperfil", estado);
            }
            perfilList = (List<Perfil>) q.getResultList();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return perfilList;
    }

    @Override
    public Perfil persistPerfil(Perfil perfil) {
        List<OpcionSistema> los = new ArrayList<OpcionSistema>();
        los = perfil.getOpcionSistemaList();
        perfil.setOpcionSistemaList(null);
        em.persist(perfil);

        if (los != null && los.size() > 0) {
            for (OpcionSistema os : los) {
                PerfilOpcionSistema pos = new PerfilOpcionSistema();
                PerfilOpcionSistemaPK pospk = new PerfilOpcionSistemaPK();
                pospk.setIdopsist(new BigInteger(os.getIdopsist().intValue() + ""));
                pospk.setIdperfil(new BigInteger(perfil.getIdperfil().intValue() + ""));

                pos.setPerfil(perfil);
                pos.setOpcionSistema(os);
                pos.setPerfilOpcionSistemaPK(pospk);
                pos.setFechasigperfopsist(new Date());

                em.persist(pos);
            }
        }
        return perfil;
    }

    @Override
    public int updatePerfil(Perfil perfil) {
        int retorno = 1;
        try {
            StringBuffer sb = new StringBuffer();
            sb.append("update perfil set ");
            sb.append("nombreperfil=?, ");
            sb.append("iseditperfil=? ");
            sb.append("where idperfil=? ");
            Query q = em.createNativeQuery(sb.toString());
            q.setParameter(1, perfil.getNombreperfil());
            q.setParameter(2, perfil.getIseditperfil());
            q.setParameter(3, perfil.getIdperfil());
            q.executeUpdate();
            if(deleteOpcionSistemaByPerfil(perfil)==1){
                for(OpcionSistema os : perfil.getOpcionSistemaList()){
                    PerfilOpcionSistema pos = new PerfilOpcionSistema();
                    PerfilOpcionSistemaPK pospk = new PerfilOpcionSistemaPK();
                    pospk.setIdopsist(new BigInteger(os.getIdopsist()+""));
                    pospk.setIdperfil(new BigInteger(perfil.getIdperfil()+""));
                    pos.setPerfilOpcionSistemaPK(pospk);
                    pos.setPerfil(perfil);
                    pos.setOpcionSistema(os);
                    em.persist(pos);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        }
        return retorno;
    }
    
    
    public int deleteOpcionSistemaByPerfil(Perfil perfil){
        try{
            Query q = em.createNativeQuery("delete from perfil_opcion_sistema where idperfil=?");
            q.setParameter(1, perfil.getIdperfil());
            q.executeUpdate();
        }catch(Exception e){
            e.printStackTrace();
            return -1;
        }
        return 1;
    }
    
    @Override
    public int deletePerfil(Perfil perfil){
        try{
            Query q = em.createQuery("delete from Perfil p where p.idperfil=:idperfil");
            q.setParameter("idperfil", perfil.getIdperfil());
            q.executeUpdate();
        }catch(Exception e){
            e.printStackTrace();
            return -1;
        }
        return 1;
    }
}
